package br.com.mauricioreis.db;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

public class Alimento extends Entidade {

    public static final String DATABASE_TABLE = "alimento";
    public static final String TABLE_CREATE = "create table alimento (id integer primary key autoincrement, "
            + "nome text not null, carboidrato float not null," + "proteina float not null," + "gordura_total float not null,"
            + "gordura_saturada float not null," + "fibra float not null," + "sodio float not null," + "calcio float," + "ferro float,"
            + "vitamina_c float); ";

    private static final String[] COLUMNS = new String[] { GenericDAO.KEY_ID, "nome", "carboidrato", "proteina", "gordura_total",
            "gordura_saturada", "fibra", "sodio", "calcio", "ferro", "vitamina_c" };
    private int id;
    private String nome;
    private Float carboidrato;
    private Float proteina;
    private Float gorduraTotal;
    private Float gorduraSaturada;
    private Float fibra;
    private Float sodio;
    private Float calcio;
    private Float ferro;
    private Float vitaminaC;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void setCarboidrato(Float carboidrato) {
        this.carboidrato = carboidrato;
    }

    public Float getCarboidrato() {
        return carboidrato;
    }

    public Float getProteina() {
        return proteina;
    }

    public void setProteina(Float proteina) {
        this.proteina = proteina;
    }

    public Float getGorduraTotal() {
        return gorduraTotal;
    }

    public void setGorduraTotal(Float gorduraTotal) {
        this.gorduraTotal = gorduraTotal;
    }

    public Float getGorduraSaturada() {
        return gorduraSaturada;
    }

    public void setGorduraSaturada(Float gorduraSaturada) {
        this.gorduraSaturada = gorduraSaturada;
    }

    public Float getFibra() {
        return fibra;
    }

    public void setFibra(Float fibra) {
        this.fibra = fibra;
    }

    public Float getSodio() {
        return sodio;
    }

    public void setSodio(Float sodio) {
        this.sodio = sodio;
    }

    public Float getCalcio() {
        return calcio;
    }

    public void setCalcio(Float calcio) {
        this.calcio = calcio;
    }

    public Float getFerro() {
        return ferro;
    }

    public void setFerro(Float ferro) {
        this.ferro = ferro;
    }

    public Float getVitaminaC() {
        return vitaminaC;
    }

    public void setVitaminaC(Float vitaminaC) {
        this.vitaminaC = vitaminaC;
    }

    public static Long incluir(Activity atividade, Alimento alimento) {

        GenericDAO dao = obtemDao(atividade);
        Long id = null;
        if (dao != null) {

            ContentValues values = toContentValue(alimento);
            id = dao.inserir(Alimento.DATABASE_TABLE, values);
            dao.close();
        }
        return id;
    }

    public static void editar(Activity atividade, Alimento alimento) {
        GenericDAO dao = obtemDao(atividade);
        ContentValues values = toContentValue(alimento);
        dao.atualizar(DATABASE_TABLE, alimento.getId(), values);
    }

    public static void excluir(Activity atividade, Alimento alimento) {
        GenericDAO dao = obtemDao(atividade);
        dao.deletar(DATABASE_TABLE, alimento.getId());
    }

    public static Alimento consultar(Activity atividade, Alimento alimento) {
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.get(DATABASE_TABLE, COLUMNS, alimento.getId());
        alimento = cursorParaAlimento(cursor);
        return alimento;
    }

    public static List<Alimento> listar(Activity atividade, Alimento filtro) {
        Cursor cursor = null;
        List<Alimento> list = new ArrayList<Alimento>();
        GenericDAO dao = obtemDao(atividade);

        if (dao != null) {

            cursor = dao.get(Alimento.DATABASE_TABLE, Alimento.COLUMNS);

            if (cursor != null) {
                if (cursor.moveToFirst()) {

                    int count = cursor.getCount();

                    for (int i = 0; i < count; i++) {
                        Alimento alimentoRet = cursorParaAlimento(cursor);
                        list.add(alimentoRet);
                        cursor.moveToNext();
                    }
                }
            }
        }
        return list;
    }

    private static Alimento cursorParaAlimento(Cursor cursor) {
        // Se o cursor está vazio, retorna nulo
        if (cursor.getCount() == 0) {
            return null;
        }
        int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID);
        int nomeColumn = cursor.getColumnIndex("nome");
        int carboidratoColumn = cursor.getColumnIndex("carboidrato");
        int proteinaColumn = cursor.getColumnIndex("proteina");
        int gorduraTotalColumn = cursor.getColumnIndex("gordura_total");
        int gorduraSuturadaColumn = cursor.getColumnIndex("gordura_saturada");
        int fibraColumn = cursor.getColumnIndex("fibra");
        int sodioColumn = cursor.getColumnIndex("sodio");
        int calcioColumn = cursor.getColumnIndex("calcio");
        int ferroColumn = cursor.getColumnIndex("ferro");
        int vitaminaCColumn = cursor.getColumnIndex("vitamina_c");
        Alimento alimentoRet = new Alimento();

        alimentoRet.setId(cursor.getInt(idColumn));
        alimentoRet.setNome(cursor.getString(nomeColumn));
        alimentoRet.setCarboidrato(cursor.getFloat(carboidratoColumn));
        alimentoRet.setProteina(cursor.getFloat(proteinaColumn));
        alimentoRet.setGorduraTotal(cursor.getFloat(gorduraTotalColumn));
        alimentoRet.setGorduraSaturada(cursor.getFloat(gorduraSuturadaColumn));
        alimentoRet.setFibra(cursor.getFloat(fibraColumn));
        alimentoRet.setSodio(cursor.getFloat(sodioColumn));
        alimentoRet.setCalcio(cursor.getFloat(calcioColumn));
        alimentoRet.setFerro(cursor.getFloat(ferroColumn));
        alimentoRet.setVitaminaC(cursor.getFloat(vitaminaCColumn));

        return alimentoRet;
    }

    private static ContentValues toContentValue(Alimento alimento) {
        ContentValues values = new ContentValues();
        values.put("nome", alimento.getNome());
        values.put("carboidrato", alimento.getCarboidrato());
        values.put("proteina", alimento.getProteina());
        values.put("gordura_total", alimento.getGorduraTotal());
        values.put("gordura_saturada", alimento.getGorduraSaturada());
        values.put("fibra", alimento.getFibra());
        values.put("sodio", alimento.getSodio());
        values.put("calcio", alimento.getCalcio());
        values.put("ferro", alimento.getFerro());
        values.put("vitamina_c", alimento.getVitaminaC());
        return values;
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, DATABASE_NAME, TABLE_CREATE, DATABASE_TABLE, DATABASE_VERSION);
    }

    @Override
    public String toString() {
        return this.nome;
    }

    public static Alimento consultarPorNome(Activity atividade, String nomeAlimento) {
        String where = "nome like '" + nomeAlimento + "'";
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.getComWhere(Alimento.DATABASE_TABLE, COLUMNS, where);
        return cursorParaAlimento(cursor);
    }
}
